iT邦幫忙

2021 iThome 鐵人賽

DAY 6
3
Arm Platforms

STM32 基礎入門教學系列 第 6

【Day6】:GPIO輸入輸出(中)

  • 分享至 

  • xImage
  •  

GPIO 輸出-LED閃爍

昨天我們成功將腳位設定成輸出模式,現在我們將PB0腳位設定為輸出模式。會選PB0是因為STM32F429ZI這塊晶片的PB0腳位與USER LED的正極是連通的。因此只要將PB0設為輸出,LED就會亮,可以很直觀的判斷是否成功輸出。
https://ithelp.ithome.com.tw/upload/images/20210905/20141525Zpeyaewyj5.jpg
這塊開發版上有3個LED分別對應到的腳位為PB0、PB7、PB14
繼上次介紹HAL_Delay()後,我們來認識學習STM的第二個函式吧~
這個函式的功能就是Arduino的digitalWrite()

HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_PIN, GPIO_PinState PinState);

這是這個函式的API,不要看到一堆不認識的型態就害怕,舉個例子你就明白了
假設你要讓PB0腳位輸出高電為,第一個參數就放GPIOB,就是"GPIO"+腳位的英文。第二個參數放GPIO_PIN_0,即"GPIO_PIN_" +第幾號腳位,最後一個參數如果你要輸出HIGH,就放GPIO_PIN_SET;LOW就放GPIO_PIN_RESET,很簡單吧。
完整的程式碼如下

HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);

搭配我們先前學過的HAL_Delay()函數

/* USER CODE BEGIN WHILE */
while (1) {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);
    HAL_Delay(500);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
    HAL_Delay(500);
}
/* USER CODE END 3 */

就可以讓LED以1Hz的頻率閃爍囉~

這個程式就像是學程式語言第一支程式一定都是在螢幕上輸出HelloWorld一樣呢

我們再來介紹今天的第二個語法吧

HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);

這個函式與剛剛的很像,只不過這個會根據你現在的狀況來做輸出,每次都輸出與現在狀態相反的狀態,例如現在是HIGH則下次輸出LOW,反之亦然。
於是我們可以再更精簡我們的程式碼

/* USER CODE BEGIN WHILE */
while (1) {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
    HAL_Delay(500);
}
/* USER CODE END 3 */

GPIO-輸入

學習完輸出,我們來學習輸入
要注意的是我們要把腳位設定成輸入模式(剛剛是輸出模式)
將.ioc檔內配置將PF13腳位配置成輸入模式(GPIO_Input),這樣就完成設定啦
我們可以設計一個簡單的線路,將剛剛已經設定好的PB0以杜邦線連接到PF13,這樣我們就可以用PF13來偵測PB0所輸出的腳位啦
https://ithelp.ithome.com.tw/upload/images/20210905/20141525xSIX173Mzr.jpg
接下來介紹今天最後一個語法

HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

這個函式可以讀取現在輸入是高電位還是低電位,直接來個範例吧

/* USER CODE BEGIN WHILE */
while (1) {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
    state = HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_13);
    HAL_Delay(500);
}
/* USER CODE END 3 */

記得在全域變數宣告一個整數變數state喔
接著再利用我們之前提到的小工具-現場表達式,就可以看到state的值一直在1和0這兩個數字交替變換囉

小結

今天總共介紹了3個函式分別是

  1. HAL_GPIO_WritePin()
  2. HAL_GPIO_TogglePin()
  3. HAL_GPIO_ReadPin()
    用這三個函式搭配適當的HAL_Delay()基本上已經可以做許多的控制了。但我們目前還缺了一個重要的東西那就是類比輸入,明天再接著學習吧

上一篇
【Day5】:GPIO輸入輸出(上)
下一篇
【Day7】:GPIO輸入輸出(下)
系列文
STM32 基礎入門教學28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言